home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
QRZ! Ham Radio 6
/
QRZ Ham Radio Callsign Database - Volume 6.iso
/
mac
/
files
/
amiga
/
rhinosrc.lha
/
scc.h
< prev
next >
Wrap
C/C++ Source or Header
|
1991-02-10
|
6KB
|
153 lines
#ifndef _SCC_H
#define _SCC_H
/* Definitions for Z8530 SCC driver by PE1CHL
* Adapted for NOS 1/23/90
* Ken Mitchum KY3B
* km@speedy.cs.pitt.edu
* km@cadre.dsl.pitt.edu
*/
#ifndef _MBUF_H
#include "mbuf.h"
#endif
#ifndef _IFACE_H
#include "iface.h"
#endif
#define INLINE 1
typedef int16 ioaddr; /* type definition for an 'io port address' */
#define MAXSCC 4 /* maximal number of SCC chips supported */
#define TPS (1000/MSPTICK) /* scctim() ticks per second */
# if defined(INLINE)
/* special delay construction only necessary when inline IN/OUT is used */
#define D(v) scc_delay(v) /* delay for 5 PCLK cycles (or more) */
#define RDREG(a) (D(inportb(a))) /* read any input port */
#define WRREG(a,v) {outportb(a,v); D(1);} /* write any output port */
#define RDSCC(c,r) (outportb(c,r), D(1), D(inportb(c))) /* read SCC reg */
#define WRSCC(c,r,v) {outportb(c,r); D(1); outportb(c,v); D(1);} /* write SCC reg*/
# else
#define RDREG(a) (inportb(a)) /* read any input port */
#define WRREG(a,v) {outportb(a,v);} /* write any output port */
#define RDSCC(c,r) (outportb(c,r), inportb(c)) /* read SCC reg */
#define WRSCC(c,r,v) {outportb(c,r); outportb(c,v);} /* write SCC reg */
# endif
#define HWEAGLE 0x01 /* hardware type for EAGLE card */
#define HWPC100 0x02 /* hardware type for PC100 card */
#define HWPRIMUS 0x04 /* hardware type for PRIMUS-PC (DG9BL) card */
#define HWDRSI 0x08 /* hardware type for DRSI PC*Packet card */
#ifndef VOID
#define VOID(x) (x) /* not necessary for most compilers */
#endif
struct sccinfo {
int init; /* SCC driver initialized? */
int nchips; /* Number of SCC chips in system */
int maxchan; /* Highest valid channel number */
ioaddr iobase; /* Base address of first SCC */
int space; /* Spacing between subsequent SCCs */
int off[2]; /* Offset to A and B channel control regs */
int doff; /* Offset from control to data register */
int ivec; /* System interrupt vector number */
long clk; /* PCLK/RTxC frequency in Hz */
int pclk; /* flag to use PCLK (instead of RTxC) */
int hwtype; /* special hardware type indicator */
int hwparam; /* special hardware parameter */
};
extern struct sccinfo sccinfo;
/* SCC channel control structure for AX.25 mode */
struct scca {
unsigned int maxdefer; /* Timer for CSMA defer time limit */
unsigned int tstate; /* Transmitter state */
#define IDLE 0 /* Transmitter off, no data pending */
#define DEFER 1 /* Receive Active - DEFER Transmit */
#define KEYUP 2 /* Permission to keyup the transmitter */
#define KEYWT 3 /* Transmitter switched on, waiting for CTS */
#define ACTIVE 4 /* Transmitter on, sending data */
#define FLUSH 5 /* CRC sent - attempt to start next frame */
#define TAIL 6 /* End of transmission, send tail */
unsigned char txdelay; /* Transmit Delay 10 ms/cnt */
unsigned char persist; /* Persistence (0-255) as a % */
unsigned char slottime; /* Delay to wait on persistence hit */
unsigned char tailtime; /* Delay after XMTR OFF */
unsigned char fulldup; /* Full Duplex mode 0=CSMA 1=DUP 2=ALWAYS KEYED */
unsigned char waittime; /* Waittime before any transmit attempt */
unsigned char maxkeyup; /* Maximum time to transmit (seconds) */
unsigned char mintime; /* Minimal offtime after MAXKEYUP timeout */
unsigned char idletime; /* Maximum idle time in ALWAYS KEYED mode (seconds) */
};
/* SCC channel structure. one is allocated for each attached SCC channel, */
/* so 2 of these are allocated for each fully utilized SCC chip */
struct sccchan {
/* interrupt handlers for 4 different IP's */
/* MUST BE first 4 elements of this structure, and MUST remain */
/* in the sequence Transmit-Status-Receive-Special */
void (*int_transmit)(); /* Transmit Buffer Empty interrupt handler */
void (*int_extstat)(); /* External/Status Change interrupt handler */
void (*int_receive)(); /* Receive Character Avail. interrupt handler */
void (*int_special)(); /* Special Receive Condition interrupt handler */
/* don't insert anything before "ctrl" (see assembly interrupt handler) */
ioaddr ctrl; /* I/O address of CONTROL register */
ioaddr data; /* I/O address of DATA register for this channel */
unsigned char wreg[16]; /* Copy of last written value in WRx */
unsigned char status; /* Copy of R0 at last external interrupt */
unsigned char txchar; /* Char to transmit on next TX interrupt */
struct fifo fifo;
struct scca a; /* control structure for AX.25 use */
struct mbuf *rbp; /* Head of mbuf chain being filled */
struct mbuf *rbp1; /* Pointer to mbuf currently being written */
struct mbuf *sndq; /* Encapsulated packets awaiting transmission */
struct mbuf *tbp; /* Transmit mbuf being sent */
struct iface *iface; /* associated interface structure */
int bufsiz;
unsigned int timercount;/* 10ms timer for AX.25 use */
int group; /* group ID for AX.25 TX interlocking */
#define NOGROUP 0 /* not member of any group */
#define RXGROUP 0x100 /* if set, only tx when all channels clear */
#define TXGROUP 0x200 /* if set, don't transmit simultaneously */
long speed; /* Line speed, bps */
char extclock; /* External clock source on RTxC/TRxC */
char fulldup; /* External divider for fulldup available */
char tx_inhibit; /* Transmit is not allowed when set */
char dum; /* filler (keep addr even for speed) */
/* statistic information on this channel */
long rxints; /* Receiver interrupts */
long txints; /* Transmitter interrupts */
long exints; /* External/status interrupts */
long spints; /* Special receiver interrupts */
long enqueued; /* Packets actually forwarded */
long rxframes; /* Number of Frames Actally Received */
long rxerrs; /* CRC Errors or KISS errors */
unsigned int nospace; /* "Out of buffers" */
unsigned int rovers; /* Receiver Overruns */
};
extern struct sccchan *sccchan[];
#define NULLCHAN (struct sccchan *)0
/* Z8530 SCC Register access macros */
#define rd(scc,reg) RDSCC((scc)->ctrl,(reg))
#define wr(scc,reg,val) WRSCC((scc)->ctrl,(reg),((scc)->wreg[reg] = val))
#define or(scc,reg,val) WRSCC((scc)->ctrl,(reg),((scc)->wreg[reg] |= val))
#define cl(scc,reg,val) WRSCC((scc)->ctrl,(reg),((scc)->wreg[reg] &= ~(val)))
#endif /* _SCC_H */